/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webhomesites.locacao.presenter;

import br.com.webhomesites.locacao.contracts.IDevolucaoTotComPagView;
import br.com.webhomesites.locacao.contracts.IDevolucaoTotComRenovView;
import br.com.webhomesites.locacao.model.DevolucaoBO;
import br.com.webhomesites.locacao.model.LocacaoBO;
import br.com.webhomesites.padrao.utils.ManipuladorDatas;
import br.com.webhomesites.padrao.utils.Strategy;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Webhome
 */
public class DevolucaoGenericPresenterActionListener {

    static class EnterListener implements ActionListener {

        private DevolucaoTotComPagPresenter devolucaoTotComPagPresenter;
        private DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter;
        private DevolucaoParcComPagPresenter devolucaoParcComPagPresenter;
        
        DecimalFormat df = new DecimalFormat("###,###,##0.00");
        DecimalFormat dfpercent = new DecimalFormat("##0.00");
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        
        public final Strategy DEVTOTCOMPAG = new DevTotComPagStrategy();
        public final Strategy DEVTOTCOMRENOV = new DevTotComRenovStrategy();
        public Strategy operacao = DEVTOTCOMPAG;

        public EnterListener(DevolucaoTotComPagPresenter devolucaoTotComPagPresenter, DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter, DevolucaoParcComPagPresenter devolucaoParcComPagPresenter) {
            this.devolucaoTotComPagPresenter = devolucaoTotComPagPresenter;
            this.devolucaoTotComRenovPresenter = devolucaoTotComRenovPresenter;
            this.devolucaoParcComPagPresenter = devolucaoParcComPagPresenter;
        }

        public void setOperacao(Strategy operacao) {
            this.operacao = operacao;
        }

        public Strategy getOperacao() {
            return operacao;
        }

        @Override
        public void actionPerformed(ActionEvent evt) {
            if (devolucaoTotComPagPresenter != null) {
                if (evt.getSource() == devolucaoTotComPagPresenter.getView().getTxtValorDescValor()) {
                    System.out.println("Entrou no valor 1");
                    setOperacao(DEVTOTCOMPAG);
                    PresenterBean.setDevolucaoTotComPagPresenter(devolucaoTotComPagPresenter);
                    PresenterBean.setTipoDesconto("valor");
                    getOperacao().execute();

                } else if (evt.getSource() == devolucaoTotComPagPresenter.getView().getTxtValorDescPorcentagem()) {

                    setOperacao(DEVTOTCOMPAG);
                    PresenterBean.setDevolucaoTotComPagPresenter(devolucaoTotComPagPresenter);
                    PresenterBean.setTipoDesconto("porcento");
                    getOperacao().execute();
                }

            }
            if (devolucaoTotComRenovPresenter != null) {
                
                if(evt.getSource() == devolucaoTotComRenovPresenter.getView().getDiasLocRenovacao()) {
                    IDevolucaoTotComRenovView view = devolucaoTotComRenovPresenter.getView();
                    LocacaoBO locacaoBO = new LocacaoBO();
                    locacaoBO.calcularDataPrevDevolucao(null, devolucaoTotComRenovPresenter);
                    try {
                        view.setValorTotalRenovacao(df.format(DevolucaoBO.calcularValorAPagar(view.getValorTotalLocacaoPrevisto(), view.getDiasLocacaoAtual(), ManipuladorDatas.diferencaEntreDatas((Date) formatter.parse(view.getDataRenovavao()),(Date) formatter.parse(view.getDataPrevDevolucaoRenovacao())))));
                    } catch (ParseException ex) {
                        Logger.getLogger(DevolucaoGenericPresenterActionListener.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                                
                if (evt.getSource() == devolucaoTotComRenovPresenter.getView().getTxtValorDescValor()) {
                    
                    setOperacao(DEVTOTCOMRENOV);
                    PresenterBean.setDevolucaoTotComRenovPresente(devolucaoTotComRenovPresenter);
                    PresenterBean.setTipoDesconto("valor");
                    getOperacao().execute();

                } else if (evt.getSource() == devolucaoTotComRenovPresenter.getView().getTxtValorDescPorcentagem()) {

                    setOperacao(DEVTOTCOMRENOV);
                    PresenterBean.setDevolucaoTotComRenovPresente(devolucaoTotComRenovPresenter);
                    PresenterBean.setTipoDesconto("porcento");
                    getOperacao().execute();
                }
            }
        }
    }

    static class LostFocusListener implements FocusListener {

        private DevolucaoTotComPagPresenter devolucaoTotComPagPresenter;
        private DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter;
        private DevolucaoParcComPagPresenter devolucaoParcComPagPresenter;
        DecimalFormat df = new DecimalFormat("###,###,##0.00");
        DecimalFormat dfpercent = new DecimalFormat("##0.00");
        static String tipoDesconto;
        public final Strategy DEVTOTCOMPAG = new DevTotComPagStrategy();
        public final Strategy DEVTOTCOMRENOV = new DevTotComRenovStrategy();
        public Strategy operacao = DEVTOTCOMPAG;

        public LostFocusListener(DevolucaoTotComPagPresenter devolucaoTotComPagPresenter, DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter, DevolucaoParcComPagPresenter devolucaoParcComPagPresenter) {
            this.devolucaoTotComPagPresenter = devolucaoTotComPagPresenter;
            this.devolucaoTotComRenovPresenter = devolucaoTotComRenovPresenter;
            this.devolucaoParcComPagPresenter = devolucaoParcComPagPresenter;
        }

        public void setOperacao(Strategy operacao) {
            this.operacao = operacao;
        }

        public Strategy getOperacao() {
            return operacao;
        }

        @Override
        public void focusGained(FocusEvent e) {
//            if (e.getSource() == devolucaoTotComPagPresenter.getView().getTxtValorDescPorcentagem()) {
//                devolucaoTotComPagPresenter.getView().getTxtValorDescPorcentagem().selectAll();
//            }
        }

        @Override
        public void focusLost(FocusEvent evt) {
            if (devolucaoTotComPagPresenter != null) {
                if (evt.getSource() == devolucaoTotComPagPresenter.getView().getTxtValorDescValor()) {
                    System.out.println("Entrou no valor 1");
                    setOperacao(DEVTOTCOMPAG);
                    PresenterBean.setDevolucaoTotComPagPresenter(devolucaoTotComPagPresenter);
                    PresenterBean.setTipoDesconto("valor");
                    getOperacao().execute();

                } else if (evt.getSource() == devolucaoTotComPagPresenter.getView().getTxtValorDescPorcentagem()) {

                    setOperacao(DEVTOTCOMPAG);
                    PresenterBean.setDevolucaoTotComPagPresenter(devolucaoTotComPagPresenter);
                    PresenterBean.setTipoDesconto("porcento");
                    getOperacao().execute();
                }

            }
            if (devolucaoTotComRenovPresenter != null) {

                System.out.println("Executando Renov 1");
                if (evt.getSource() == devolucaoTotComRenovPresenter.getView().getTxtValorDescValor()) {
                    System.out.println("Entrou no valor");
                    setOperacao(DEVTOTCOMRENOV);
                    PresenterBean.setDevolucaoTotComRenovPresente(devolucaoTotComRenovPresenter);
                    PresenterBean.setTipoDesconto("valor");
                    getOperacao().execute();

                } else if (evt.getSource() == devolucaoTotComRenovPresenter.getView().getTxtValorDescPorcentagem()) {

                    setOperacao(DEVTOTCOMRENOV);
                    PresenterBean.setDevolucaoTotComRenovPresente(devolucaoTotComRenovPresenter);
                    PresenterBean.setTipoDesconto("porcento");
                    getOperacao().execute();
                }
            }
        }
    }

    private static class DevTotComPagStrategy implements Strategy {

        @Override
        public void execute() {

            DecimalFormat df = new DecimalFormat("###,###,##0.00");
            DecimalFormat dfpercent = new DecimalFormat("##0.00");

            DevolucaoTotComPagPresenter devolucaoTotComPagPresenter = PresenterBean.getDevolucaoTotComPagPresenter();
            IDevolucaoTotComPagView view = devolucaoTotComPagPresenter.getView();

            DevolucaoBO devolucaoBO = new DevolucaoBO();
            switch (PresenterBean.getTipoDesconto()) {
                case "valor": {
                    double valorPagar = devolucaoBO.calcularValorPagar(view.getValorTotalLocacao(), view.getValorDescontoValor(), view.getValorDescontoPorcentagem(), PresenterBean.getTipoDesconto());
                    view.setValorDescontoPorcentagem(dfpercent.format(devolucaoBO.calcularPorcentagemDesconto(view.getValorTotalLocacao(), valorPagar)));
                    view.setValorDescontoValor(df.format((view.getValorDescontoValor())));
                    view.setValorTotalPagar(df.format(valorPagar));
                    view.setBtnConfirmarRequestFocus(true);
                    break;
                }
                case "porcento": {
                    double valorPagar = devolucaoBO.calcularValorPagar(view.getValorTotalLocacao(), view.getValorDescontoValor(), view.getValorDescontoPorcentagem(), PresenterBean.getTipoDesconto());
                    view.setValorDescontoPorcentagem(dfpercent.format(view.getValorDescontoPorcentagem()));
                    view.setValorDescontoValor(df.format(devolucaoBO.calcularValorDesconto(view.getValorTotalLocacao(), valorPagar)));
                    view.setValorTotalPagar(df.format(valorPagar));
                    view.setBtnConfirmarRequestFocus(true);
                    break;
                }
            }
        }
    }

    private static class DevTotComRenovStrategy implements Strategy {

        @Override
        public void execute() {

            System.out.println("Executando Renov");

            DecimalFormat df = new DecimalFormat("###,###,##0.00");
            DecimalFormat dfpercent = new DecimalFormat("##0.00");

            DevolucaoTotComRenovPresenter devolucaoTotComRenovPresenter = PresenterBean.getDevolucaoTotComRenovPresente();
            IDevolucaoTotComRenovView view = devolucaoTotComRenovPresenter.getView();

            DevolucaoBO devolucaoBO = new DevolucaoBO();
            switch (PresenterBean.getTipoDesconto()) {
                case "valor": {
                    double valorPagar = devolucaoBO.calcularValorPagar(view.getValorTotalLocacaoAtual(), view.getValorDescontoValor(), view.getValorDescontoPorcentagem(), PresenterBean.getTipoDesconto());
                    view.setValorDescontoPorcentagem(dfpercent.format(devolucaoBO.calcularPorcentagemDesconto(view.getValorTotalLocacaoAtual(), valorPagar)));
                    view.setValorDescontoValor(df.format((view.getValorDescontoValor())));
                    view.setValorTotalPagar(df.format(valorPagar));
                    view.setBtnConfirmarRequestFocus(true);
                    break;
                }
                case "porcento": {
                                        
                    System.out.println("Passando na porcentagem interna");
                    double valorPagar = devolucaoBO.calcularValorPagar(view.getValorTotalLocacaoAtual(), view.getValorDescontoValor(), view.getValorDescontoPorcentagem(), PresenterBean.getTipoDesconto());
                    view.setValorDescontoPorcentagem(dfpercent.format(view.getValorDescontoPorcentagem()));
                    view.setValorDescontoValor(df.format(devolucaoBO.calcularValorDesconto(view.getValorTotalLocacaoAtual(), valorPagar)));
                    view.setValorTotalPagar(df.format(valorPagar));
                    view.setBtnConfirmarRequestFocus(true);
                    break;
                }
            }
        }
    }

    private static class PresenterBean {

        static DevolucaoTotComPagPresenter devolucaoTotComPagPresenter;
        static DevolucaoTotComRenovPresenter devolucaoTotComRenovPresente;
        
        static String tipoDesconto;

        public static DevolucaoTotComPagPresenter getDevolucaoTotComPagPresenter() {
            return devolucaoTotComPagPresenter;
        }

        public static void setDevolucaoTotComPagPresenter(DevolucaoTotComPagPresenter devolucaoTotComPagPresenter) {
            PresenterBean.devolucaoTotComPagPresenter = devolucaoTotComPagPresenter;
        }

        public static DevolucaoTotComRenovPresenter getDevolucaoTotComRenovPresente() {
            return devolucaoTotComRenovPresente;
        }

        public static void setDevolucaoTotComRenovPresente(DevolucaoTotComRenovPresenter devolucaoTotComRenovPresente) {
            PresenterBean.devolucaoTotComRenovPresente = devolucaoTotComRenovPresente;
        }

        public static String getTipoDesconto() {
            return tipoDesconto;
        }

        public static void setTipoDesconto(String tipoDesconto) {
            PresenterBean.tipoDesconto = tipoDesconto;
        }       
    }
}